
appid = '20231225001921182'  # 填写你的appid
secretKey = '12QNWnjLa4CA_GJFzxxQ'  # 填写你的密钥
from urllib import request
from urllib import parse
import json,random,time
import hashlib
#用于读取项目目录下的yaml_name.db
import yaml  ,os,sys  ,json                             #第三方模块yaml          需要下载  是一个配置文件解析的第三方模块
project_dir_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #项目路径
sys.path.append(project_dir_path)           #将项目路径添加到环境中   使得python可以导包
class baidu_class:
    def __init__(self,project_dir_path,default_name='_default'):
        self.default=default_name
        #config目标文件夹
        self.config_dir=project_dir_path+os.sep+'config'
        #翻译结果历史存放位置
        self.baidu_data=project_dir_path+os.sep+'other'+os.sep+'baidu_data'
        try:os.makedirs(self.baidu_data)
        except:pass
    #读取目标语言历史翻译数据
    def read_data(self,to):
        path=self.baidu_data+os.sep+to+'.yaml'
        try:
            with open(path, 'r',encoding='utf-8') as f:
                data = yaml.load(f, Loader=yaml.FullLoader)
                return data
        except:
            return {}
    #保存目标历史数据
    def save_data(self,data,to='English'):
        path=self.baidu_data+os.sep+to+'.yaml'

        yaml_data = yaml.dump(data, allow_unicode=True, sort_keys=False, indent=4)  
        
        # 将YAML字符串写入文件  
        with open(path, 'w',encoding='utf-8') as yaml_file:  
            yaml_file.write(yaml_data)
    #读取default.yaml
    def read_default(self):
        path=self.config_dir+os.sep+self.default+'.yaml'
        with open(path, 'r',encoding='utf-8') as f:
            data = f.read()
        return data
    #保存为目标语言
    def write_language(self,data,laguage_name='中文'): 
        path=self.config_dir+os.sep+laguage_name+'.yaml'    
        print(path)     
        # 将YAML字符串写入文件  
        with open(path, 'w',encoding='utf-8') as f:  
            f.write(data)
    #查找结束
    def find_end(self,str_data,标识符='_____',start_idx=0,end=('"',"'")):
        # print(str_data)
        new_str=str_data[start_idx:]
        idx1=new_str.find(标识符)
        if idx1==-1:return False
        for i in range(idx1,len(new_str)):
            if new_str[i] in end:
                idx2=i
                break
        print(idx1,idx2)
        return start_idx+idx2,new_str[idx1:idx2]
    #func为翻译单词的函数
    def 翻译为其他语言(self,dct={'English':'en','にほん':'ja'},func=None,标识符='_____'):
        #获取默认配置
        default_config=self.read_default()
        #保存为中文
        self.write_language(default_config.replace(标识符,''),laguage_name='中文')
        #读取目标语言历史数据 以及初始化配置
        data_dct={}
        config_dct={}
        for key in dct:
            data_dct[key]=self.read_data(key)
            config_dct[key]=default_config

        #循环查询带有标识符的字符串
        start_idx=0
        while 1:
            res=self.find_end(default_config,start_idx=start_idx)
            if res is False:break
            start_idx,old_find_str=res
            find_str=old_find_str[len(标识符):]
            for key in dct:
                历史数据dict=data_dct[key]
                #先从历史数据中获取数据
                get_language=历史数据dict.get(find_str)
                #历史数据里没有  再从翻译中获取
                if get_language is None:
                    print(f'准备翻译({dct[key]})',find_str)
                    time.sleep(5)
                    #翻译数据

                    get_language=func(find_str,dct[key])
                    print(f'{find_str} 翻译为:',get_language)
                    #保存数据
                    历史数据dict[find_str]=get_language
                else:
                    print(f'{find_str} 翻译为:',get_language)
                
                #替换数据
                idx1=config_dct[key].find(old_find_str)
                # if find_str=='添加加工罐':input(str(['添加加工罐',idx1,config_dct[key][idx1:idx1+30]]))
                config_dct[key]=config_dct[key][:idx1]+get_language+config_dct[key][idx1+len(old_find_str):]
                # if len(default_config)>len(config_dct[key])+500:input(str([config_dct[key],old_find_str]))

        #保存历史数据 和 配置文件
        for key in dct:
            print('开始保存',key)
            self.save_data(data_dct[key],to=key)
            self.write_language(config_dct[key],laguage_name=key)
        # for save_name in dct:

#百度翻译
def translate_Word(en_str,to_name='ja'):
    URL='http://api.fanyi.baidu.com/api/trans/vip/translate'
    From_Data={}                     #创建From_Data字典，存储向服务器发送的data
    From_Data['from']='auto'         #这里默认自动识别输入语言
    From_Data['to']=to_name             #可以在上面的语种列表中选择合适的语言
    From_Data['q']=en_str            #要翻译的数据
    From_Data['appid']=appid           #申请的APPID
    From_Data['salt']=str(random.randint(0,222222))  #随机数
    Key=secretKey                           #平台分配的密匙
    m=From_Data['appid']+en_str+From_Data['salt']+Key
    m_MD5=hashlib.md5(m.encode('utf8'))
    From_Data['sign']=m_MD5.hexdigest()

    data=parse.urlencode(From_Data).encode('utf-8')
                                                  #使用urlencode()方法转换标准格式
    response=request.urlopen(URL,data)            #传递request对象和转换完格式的数据
    html=response.read().decode('utf-8')          #读取信息并解码
    translate_results=json.loads(html)            #使用JSON
    try:
        translate_results=translate_results['trans_result'][0]['dst']   #找到翻译结果
    except:
        print(translate_results)
        raise Exception('error')
    return translate_results
if __name__=='__main__':
    #读取当前使用的配置
    baidu_obj=baidu_class(project_dir_path)
    baidu_obj.翻译为其他语言(dct={
        'English':'en'
    ,'にほん':'jp'
    },func=translate_Word,标识符='_____')